<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>寄生式组合继承</title>
</head>
<body>
<script>
    /*
    * 组合继承的问题: 会调用两次构造函数
    * */

    function Person(name) {
        this.name = name
    }

    Person.prototype.getName = function (){
        console.log(this.name)
    }

    function Student(name,age) {
        Person.call(this,name)
        this.age = age
    }
    /*第一次调用 此时  Student.prototype身上有一个值为undefined的name属性 这是我们不需要的*/
    Student.prototype = new Person()

    /*第二次调用*/
    let student = new Student('ALice',25)
    console.log(student)


    /*寄生组合继承:出现上述问题的本质是因为子类指向通过原型继承获得父类的原型 但是我们却把父类的实例对象赋值给子类原型 在new 父类构造函数的时候
    * 多执行了一次父类的构造函数，寄生组合继承的思路是直接将父类的原型赋值给子类的原型
    *
    * */
function inheritPrototype(superType,subType) {
    /*
    * 这里的操作是为了将父类的原型属性复制一份
    * 复制不是一定要创建两个一模一样的对象 可以巧妙的通过设置原型 让新对象可以借助原型访问到原先对象上的数据从某种意义上来说也是一种复制
    *
    * -- 继承从某种意义上来说也是一种复制 --
    *
    * 为什么要复制一份呢? 因为要为父类的原型这个变量上设置constructor属性,如果直接设置的话就会影响父类自身的constructor属性
    * */
    let prototype = Object.create(superType.prototype)
    prototype.constructor = superType
    superType.prototype = prototype
}

inheritPrototype(Person,Student)



</script>
</body>
</html>